《设计模式之禅》 六大设计原则

设计模式之禅

[TOC]

第一部分 六大原则

一.单一职责原则(SRP:Single Responsibility Principle)

  • 定义:应该有且仅有一个原因引起类的变更
    建议是接口一定要做到单一职责,类的设计尽量做到只有一个原因引起变化,也适用于方法
  • 优点:
    • 可以降低类的复杂度,一个类只负责一项职责,其逻辑肯定要比负责多项职责简单的多
    • 提高类的可读性,提高系统的可维护性
    • 变更引起的风险降低,变更是必然的,如果单一职责原则遵守的好,当修改一个功能时,可以显著降低对其他功能的影响

二.里氏替换原则(LSP:Liskov Substitution Principle)

  • 定义:所有引用基类的地方必须能透明地使用其他子类对象
  • 含义:
    1. 子类必须完全实现父类的方法
      如果子类不能完整的实现父类的方法,建议断开父子继承关系,采用依赖、
      聚合、组合
      等关系来替代
    2. 子类可以有自己的个性
    3. 覆盖或实现方法时输入参数(前置条件)可以被放大
    4. 覆写或实现父类方法时输出结果(后置条件)可以被缩小

依赖:强调的是使用上的关系,是单向的
关联(聚合、组合):

  • 聚合(has-a):整体和部分都可以有各自的声明周期
  • 组合(contains-a):整体和部分不可分割
    UML图指向整体,聚合为空心菱形,组合为实心

UML类图的画法见另一份笔记
继承是is-a。接口是like-a。参考博文: https://blog.csdn.net/jy55149676/article/details/80537779

三.依赖倒置原则(DIP:Dependence Inversion Principle)

  • 含义:

    1. 高层模块不应该依赖低层模块,两者应该依赖其抽象
    2. 抽象不应该依赖细节
    3. 细节应该依赖抽象

      不可分割的原子逻辑就是低层模块,原子逻辑再组装就是高层模块
      java语言中,抽象:接口或抽象类,细节:可以直接被实例化

  • 实践:

    1. 每个类尽量都有接口或抽象类
    2. 变量的表面类型尽量是接口或抽象类
    3. 任何类都不应该从具体类派生

四.接口隔离原则(Interface Segregation Principle)

  • 定义:客户端不应该依赖它不需要的接口,一个类对另一个类的依赖应该建立在最小的接口上
    接口要尽量小,但也是有限度的
  • 优点:通过分散定义多个接口,可以预防未来变更的扩散,提高系统的灵活性和可维护性

    单一职责与接口隔离对比:两者审视的角度不同
    单一职责注重业务逻辑的划分;接口隔离注重接口的方法应该尽量少,只暴露别人需要的部分
    根据接口隔离原则划分接口的时候,首先必须满足单一职责原则

五.迪米特法则

  • 定义:一个对象应该对其他对象有最少了解(只与朋友类交流、两部分之间的交流做适当的控制)
  • 优点:弱耦合(弱耦合可以使得类的复用率提高,但是会产生大量的中转类,导致系统复杂性的提高)

六.开闭原则

  • 定义:一个软件实体应该对扩展开放,对修改关闭
    (前面五个原则是对开闭原则的具体解释)
  • 优点:在对扩展开放的同时,尽量减少对原有代码的修改,保持历史代码的纯洁性,提高系统的稳定性
0%